В C++ управление ростом контейнеров — это архитектурный танец между Размер (текущие элементы) и Вместимость (зарезервированная память). Для последовательных контейнеров, таких как vector и string, достижение вместимости вызывает перераспределение: система находит более крупный блок памяти, перемещает все элементы и уничтожает старый блок. Это дорогостоящая операция $O(n)$, которая приводит к невалидации итератора—ваше указание на старые элементы становится «висячим» и опасным.
1. Стратегия расширения
Чтобы избежать частых перераспределений, vector реализации выделяют «буферное» пространство. Команда c.reserve(n) явно задаёт минимальную вместимость без добавления элементов, в то время как c.shrink_to_fit() —это необязательный запрос вернуть избыточную память системе.
2. Разница между изменением размера и резервированием
Хотя reserve reserve влияет только на буфер, resize(n) resize(n) активно меняет логику контейнера. Уменьшение через resize уничтожает элементы, а увеличение добавляет значения по умолчанию.
resize контейнер сжимается, итераторы к удалённым элементам становятся невалидными. Если расширение вызывает перераспределение, ВСЕ все итераторы становятся невалидными.